/**
 * 前端API接口测试脚本
 * 用于检测和诊断前端接口调用错误
 */

const axios = require('axios');

// 测试配置
const API_BASE_URL = process.env.REACT_APP_API_URL || 'https://localhost:5006';

// 测试数据
const testAgent = {
  name: 'Test Agent',
  description: 'Test agent for API validation',
  systemPrompt: 'You are a helpful assistant',
  agentType: 0,
  configuration: '{}',
  isActive: true,
  maxTokens: 1000,
  temperature: 0.7,
  timeoutSeconds: 30
};

// 测试结果收集
const testResults = [];

// 记录测试结果
function logTestResult(testName, passed, error = null) {
  const result = {
    testName,
    passed,
    error: error?.message || error,
    timestamp: new Date().toISOString()
  };
  testResults.push(result);
  console.log(`[${passed ? '✅' : '❌'}] ${testName}`);
  if (error) {
    console.log(`   Error: ${error.message || error}`);
  }
}

// 创建axios实例
const api = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
  },
  timeout: 10000,
  validateStatus: function (status) {
    return status < 500; // 接受所有小于500的状态码
  }
});

// 测试函数
async function testAPIConnections() {
  console.log('🚀 开始前端API接口测试...');
  console.log(`📍 API基础URL: ${API_BASE_URL}\n`);

  // 测试1: 基础连接测试
  console.log('📋 测试1: 基础连接测试');
  try {
    const response = await api.get('/api/agent-platform/agents', {
      params: { skipCount: 0, maxResultCount: 1 }
    });
    logTestResult('基础连接测试', response.status < 400);
  } catch (error) {
    logTestResult('基础连接测试', false, error);
  }

  // 测试2: 创建智能体
  console.log('\n📋 测试2: 创建智能体');
  try {
    const response = await api.post('/api/agent-platform/agents', testAgent);
    logTestResult('创建智能体', response.status === 200 || response.status === 201);
    if (response.data?.id) {
      testAgent.id = response.data.id; // 保存ID用于后续测试
    }
  } catch (error) {
    logTestResult('创建智能体', false, error);
  }

  // 测试3: 获取智能体列表
  console.log('\n📋 测试3: 获取智能体列表');
  try {
    const response = await api.get('/api/agent-platform/agents', {
      params: { skipCount: 0, maxResultCount: 10 }
    });
    logTestResult('获取智能体列表', response.status === 200);
    console.log(`   返回数据量: ${response.data?.items?.length || 0} 条`);
  } catch (error) {
    logTestResult('获取智能体列表', false, error);
  }

  // 测试4: 获取模型配置列表
  console.log('\n📋 测试4: 获取模型配置列表');
  try {
    const response = await api.get('/api/agent-platform/model-configs', {
      params: { skipCount: 0, maxResultCount: 10 }
    });
    logTestResult('获取模型配置列表', response.status === 200);
    console.log(`   模型配置数量: ${response.data?.items?.length || 0} 个`);
  } catch (error) {
    logTestResult('获取模型配置列表', false, error);
  }

  // 测试5: 获取提示词模板列表
  console.log('\n📋 测试5: 获取提示词模板列表');
  try {
    const response = await api.get('/api/agent-platform/prompt-templates', {
      params: { skipCount: 0, maxResultCount: 10 }
    });
    logTestResult('获取提示词模板列表', response.status === 200);
    console.log(`   模板数量: ${response.data?.items?.length || 0} 个`);
  } catch (error) {
    logTestResult('获取提示词模板列表', false, error);
  }

  // 测试6: 测试认证（如果需要）
  console.log('\n📋 测试6: 认证测试');
  try {
    const response = await api.post('/api/auth/login', {
      usernameOrEmail: 'admin',
      password: 'admin123'
    });
    logTestResult('用户登录测试', response.status === 200);
    if (response.data?.accessToken) {
      console.log('   登录成功，获取到Token');
    }
  } catch (error) {
    logTestResult('用户登录测试', false, error);
  }

  // 测试7: 清理测试数据
  if (testAgent.id) {
    console.log('\n📋 测试7: 清理测试数据');
    try {
      const response = await api.delete(`/api/agent-platform/agents/${testAgent.id}`);
      logTestResult('删除测试智能体', response.status === 200 || response.status === 204);
    } catch (error) {
      logTestResult('删除测试智能体', false, error);
    }
  }

  // 生成测试报告
  generateTestReport();
}

// 生成测试报告
function generateTestReport() {
  console.log('\n📊 测试报告');
  console.log('='.repeat(50));

  const passedTests = testResults.filter(r => r.passed).length;
  const failedTests = testResults.filter(r => !r.passed).length;
  const totalTests = testResults.length;

  console.log(`总测试数: ${totalTests}`);
  console.log(`通过测试: ${passedTests}`);
  console.log(`失败测试: ${failedTests}`);
  console.log(`成功率: ${((passedTests / totalTests) * 100).toFixed(1)}%`);

  if (failedTests > 0) {
    console.log('\n❌ 失败的测试:');
    testResults.filter(r => !r.passed).forEach(result => {
      console.log(`  - ${result.testName}: ${result.error}`);
    });
  }

  console.log('\n🔍 错误分析:');
  const errorTypes = {};
  testResults.filter(r => !r.passed).forEach(result => {
    const errorType = result.error.includes('ECONNREFUSED') ? '连接拒绝' :
                     result.error.includes('timeout') ? '超时' :
                     result.error.includes('401') ? '认证失败' :
                     result.error.includes('404') ? '接口不存在' :
                     result.error.includes('500') ? '服务器错误' : '其他错误';
    errorTypes[errorType] = (errorTypes[errorType] || 0) + 1;
  });

  Object.entries(errorTypes).forEach(([type, count]) => {
    console.log(`  - ${type}: ${count} 次`);
  });

  console.log('\n💡 建议:');
  if (errorTypes['连接拒绝']) {
    console.log('  - 请确保后端服务正在运行');
    console.log('  - 检查API地址和端口配置');
  }
  if (errorTypes['认证失败']) {
    console.log('  - 检查JWT Token配置');
    console.log('  - 确认用户认证服务正常');
  }
  if (errorTypes['超时']) {
    console.log('  - 检查网络连接');
    console.log('  - 考虑增加超时时间');
  }
  if (errorTypes['接口不存在']) {
    console.log('  - 确认API路由配置正确');
    console.log('  - 检查后端服务版本');
  }

  console.log('\n测试完成！');
}

// 运行测试
if (require.main === module) {
  testAPIConnections().catch(console.error);
}

module.exports = { testAPIConnections, logTestResult };